import data from './data.txt?raw'
import 注_ from './annot.json'
export const 注: Partial<Record<string, string>> = 注_

type 字 = {
  c: string
  级: number
  号: number
  第: number
  共: number
  画: number
  繁: string
  异: string[]
}

type 项 = {
  自: 字[]
  繁: 字[]
  异: 字[]
}

export const 总: 字[] = []
export const 表 = new Map<string, 项>()
const 加 = (字: 字) => {
  总.push(字)
  const 取 = (c: string) => {
    let 项 = 表.get(c)
    if (项 != null) return 项
    项 = { 自: [], 繁: [], 异: [] }
    表.set(c, 项)
    return 项
  }
  取(字.c).自.push(字)
  if (字.繁 != '') 取(字.繁).繁.push(字)
  字.异.forEach(c => 取(c).异.push(字))
}
const 索引: number[] = []

let 号 = 1
data.split(';').forEach((data, 级) => {
  data.split('#').forEach((data, 画) => {
    画 += 1
    data.split('|').forEach((data, i) => {
      if (i % 2 == 0) {
        for (const c of data) {
          索引.push(总.length)
          加({ c, 级, 画, 号: 号++, 第: 0, 共: 1, 繁: '', 异: [] })
        }
      } else {
        const cs = data.split(',')
        const c = cs[0]
        索引.push(总.length)
        for (let 第 = 0, 共 = ~~(cs.length / 2); 第 < 共; 第++) {
          const i = 1 + 第 * 2
          const 异 = Array.from(cs[i + 1].matchAll(/\{.*?\}|./gu), x => x[0])
          const 字 = { c, 级, 画, 号, 第, 共, 繁: cs[i], 异 }
          加(字)
        }
        号++
      }
    })
  })
})

export const 查 = (s: string) => {
  const set = new Set<字>()
  for (const c of s) {
    const 项 = 表.get(c)
    if (项 == null) continue
    项.自.forEach(字 => set.add(字))
    项.繁.forEach(字 => set.add(字))
    项.异.forEach(字 => set.add(字))
  }
  return [...set].sort((a, b) => (a.号 - b.号) || (a.第 - b.第))
}

export const 取 = (号: number) => {
  const i = 索引[号 - 1]
  if (i == null) return []
  return 总.slice(i, i + 总[i].共)
}
